#define _CRT_SECURE_NO_WARNINGS 1




//（1）用来计算数字中二进制位1的个数
//如果源码-1，在补码中也就会相应的会减去1
//#include<stdio.h>
//
//int NumberOf1(int n) {
//    int count = 0;
//    while (n != 0) {
//        n = n & (n - 1); //我们需要一个步骤将补码的最右侧开始一直到符号位变成0
//        count++;
//    }
//    return count;
//}
//
//int main(void)
//{
//    printf("%d", NumberOf1(-1));
//}
//《1》这个题目是比较经典的，-1的补码是11111.....1，如果减去1会变成 11111...1110,异或就会变成11111.....110
//再减去1会变成 1111...1101,此时和上面的异或变成 1111...1100
//再减去1变成111....1011,再和上面的异或就会变成1111....1000

//《2》也就是说上面的规律就是第几次异或就会消失掉二进制位中的第几个1.   如果中间出现了0的补码同样也准勋这个规律。







//（2）不用第三个变量的情况下交换两个数字
//#include<stdio.h>
//int main(void)
//{
//	int a = 1;
//	int b = 2;
//	a = a ^ b;//此时a是两者的异或
//	b = a ^ b;//两者的异或再异或b就是a
//	a = a ^ b;//a此时还是两者的异或，b已经是a最开始的值，两者异或就是b
//	printf("a:%d,b:%d", a, b);
//}







//(3)获取一个整数二进制序列中的奇数位和偶数位，并打印出来
//#include<stdio.h>
//int main(void) {
//	int n = 1;
//	int num = n;
//	int count = 1;//也就是需要进行32次判断,需要进行移位31次
//	int arr[33] = { 0 };
//	while (count!=33) {
//		arr[count++] = n & 1;
//		n=n >> 1;
//	}
//	printf("数字%d的二进制序列是:",num);
//	for (int i = 32; i >=1; i--) {
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	printf("数字%d的二进制序列奇数位是:",num);
//	for (int i = 31; i >=1; i-=2) {
//		printf("%d ", arr[i]);
//	}
//	printf("\n");	
//	printf("数字%d的二进制序列偶数位是:",num);
//	for (int i = 32; i >=2 ; i-=2) {
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}









//(4)写出一个函数，输入两个数字，输出两个数字二进制位数相同单数字不同的地方
//#include<stdio.h>
//
//
//int main() {
//    int m, n;
//    int count=0;
//    scanf("%d %d",&m, &n);
//    m = m ^ n;//所有的不同的位置组成的数字
//    n = 32;
//    while (n) {//这个结果的运行，到最后必定是为0时停止
//        if (m & 1 == 1) {
//            count++;
//        }
//        m=m >> 1;
//        n--;
//    }
//    printf("%d\n", count);
//}